电商平台的核心数据分析问题:
数据来源:某国际电商平台(Superstore)销售数据
分析框架:
pd.read_excel() 读取 Excel 格式销售数据Postal Code 字段.shape 和 .head() 初步了解数据规模与结构分析方法:按订单日期分组,统计每天折扣种类数量
结论:同一天不同商品会采取不同的折扣
分析方法:按子品类和折扣力度分组,统计利润与天数
# 注:依赖 superstore.xlsx 数据,此处展示分析逻辑
# category_discount = data.groupby(['Sub-Category', 'Discount']).agg({
# 'Profit': 'sum', # 计算该品类在该折扣下的总利润
# 'Order Date': 'nunique' # 统计该折扣持续的天数
# })
# category_discount['Profit_per_day'] = (
# category_discount['Profit'] / category_discount['Order Date']
# )
# print(category_discount.head(15))结论:不同品类的商品,折扣力度并不相同
核心思路:剔除品类数量和折扣时间的影响
# 注:依赖 superstore.xlsx 数据,此处展示分析逻辑
# profit_by_discount = data.groupby('Discount').agg({
# 'Quantity': 'sum', # 总销量
# 'Sales': 'sum', # 总销售额
# 'Profit': 'sum', # 总利润
# 'Order Date': 'nunique', # 不重复日期数
# 'Product Name': 'nunique' # 不重复产品数
# })
# profit_by_discount.columns = [
# 'Quantity_sum', 'Sales_sum', 'Profit_sum',
# 'Dates_sum', 'Products_sum'
# ]核心公式:
\[ \text{平均利润} = \frac{\text{总利润}}{\text{产品数} \times \text{天数}} \]
# 注:依赖 superstore.xlsx 数据,此处展示分析逻辑
# profit_by_discount['Profit_p_p'] = (
# profit_by_discount['Profit_sum'] /
# profit_by_discount['Products_sum'] /
# profit_by_discount['Dates_sum']
# ) # 每产品每天平均利润
#
# profit_by_discount['Sales_p_p'] = (
# profit_by_discount['Sales_sum'] /
# profit_by_discount['Products_sum'] /
# profit_by_discount['Dates_sum']
# ) # 每产品每天平均销售额
#
# profit_by_discount['Quantity_p_p'] = (
# profit_by_discount['Quantity_sum'] /
# profit_by_discount['Products_sum'] /
# profit_by_discount['Dates_sum']
# ) # 每产品每天平均销量# 注:依赖 superstore.xlsx 数据,此处展示分析逻辑
# profit_filtered = profit_by_discount.query('Products_sum > 19')
# sns.set(style='darkgrid')
# plt.figure(figsize=(10, 6))
# for metric, label in zip(
# ['Profit_p_p', 'Sales_p_p', 'Quantity_p_p'],
# ['平均利润', '平均销售额', '平均销售数量']
# ):
# sns.lineplot(x='Discount', y=metric, label=label, data=profit_filtered)
# plt.legend()
# plt.xlabel('折扣')
# plt.ylabel('数值')
# plt.title('折扣与业务指标关系')
# plt.show()折扣20%是利润正负的拐点
| 折扣区间 | 利润情况 | 策略建议 |
|---|---|---|
| < 20% | 利润为正 | 安全区间 |
| > 20% | 利润为负 | 需谨慎使用 |
低折扣「小刀」策略效果最佳
85%、55%、57% 折扣出现极端负利润
| 策略方向 | 具体建议 |
|---|---|
| 常规定价 | 控制折扣在 20% 以内 |
| 促销策略 | 小幅折扣(0.2%-7%)效果最佳 |
| 避免亏损 | 谨慎使用高折扣促销 |
| 差异化定价 | 不同品类采用不同折扣策略 |
# 注:superstore.xlsx 数据文件本地没有,但平台已经内置
# ⚠️ 平台原始代码 - 请原样输入至教学平台(注释除外),平台才会判定答案正确
# 导入必要的包
import pandas as pd # 用于数据处理和分析
import matplotlib.pyplot as plt # 用于绘图
import seaborn as sns # 用于高级绘图
from datetime import datetime # 用于处理日期时间数据
# 读取Excel文件
data = pd.read_excel('superstore.xlsx')
# 删除Postal Code字段
del data['Postal Code']
print(data.head()) # 输出前几行数据
# 折扣与销售利润关系探究
# 判断每一天是不是同一个折扣
huigui01 = data.groupby('Order Date').Discount.nunique()
print(huigui01.head()) # 输出前几行数据
# 判断每个品类的折扣情况
huigui03 = data.groupby(['Sub-Category', 'Discount']).agg({
'Profit': 'sum', # 计算每个子类别和折扣组合的总利润
'Order Date': 'nunique', # 计算每个子类别和折扣组合的唯一订单日期数量
}) # 数据结构定义结束
huigui03['Profit_pd'] = huigui03['Profit'] / huigui03['Order Date'] # 计算单位时间内的平均利润
print(huigui03.head(15)) # 打印前15行结果,检查每个子类别和折扣组合的利润情况
# 通过前面的判断,可以发现:
# 1)同一天不同商品会采取不同的折扣;
# 2)不同品类的商品,折扣力度也并不相同;
# 为了简化问题,我们将所有销售数据按照折扣分组,然后对销量、销售额、利润等数据进行汇总聚合;
# 同时,考虑到折扣促销的本质,就是为了通过降价提高销量,相应单个产品的利润会有所下降,但是单个品类、单位时间的利润总和会得到提升;
# 因此我们在探究折扣与利润之间关系时候,需要剔除品类数量、折扣时间的影响。
# 按折扣分组,计算汇总指标
profit_8discount = data.groupby('Discount').agg({
'Quantity': 'sum', # 计算每个折扣下的总销售数量
'Sales': 'sum', # 计算每个折扣下的总销售额
'Profit': 'sum', # 计算每个折扣下的总利润
'Order Date': 'nunique', # 计算每个折扣下的唯一订单日期数量
'Product Name': 'nunique', # 计算每个折扣下的唯一商品名称数量
}) # 数据结构定义结束
# 重命名列
profit_8discount.columns = ['Quantity_sum', 'Sales_sum', 'Profit_sum', 'Dates_sum', 'Products_sum']
# 计算单位时间内每个商品的平均利润、平均销售额和平均销售数量
profit_8discount['Profit_p_p'] = profit_8discount['Profit_sum'] / profit_8discount['Products_sum'] / profit_8discount['Dates_sum'] # 平均利润
profit_8discount['Sales_p_p'] = profit_8discount['Sales_sum'] / profit_8discount['Products_sum'] / profit_8discount['Dates_sum'] # 平均销售额
profit_8discount['Quantity_p_p'] = profit_8discount['Quantity_sum'] / profit_8discount['Products_sum'] / profit_8discount['Dates_sum'] # 平均销售数量
# 重置索引,方便后续操作
profit_8discount = profit_8discount.reset_index()
print(profit_8discount) # 输出利润数据
# 选取折扣涉及商品种类大于(商品种类总数)*0.005的情形;
profit_8discount22 = profit_8discount.query('Products_sum > 19')
print(profit_8discount22) # 输出利润数据
# 绘制折扣与利润关系的折线图
sns.set(style="darkgrid") # 设置绘图风格为'darkgrid'
plt.figure(figsize=(10, 6)) # 设置画布大小
# 遍历需要绘制的列(平均利润、平均销售额、平均销售数量)
for i in profit_8discount22.columns[6:-2]:
ax = sns.lineplot(x='Discount', y=i, label=i, data=profit_8discount22) # 绑制折线图
# 添加图例和标签
plt.legend() # 显示图例
plt.xlabel('Discount Range') # 设置x轴标签
plt.ylabel('Sales') # 设置y轴标签
plt.savefig("10.png") # 保存图表为PNG文件
plt.show() # 显示图表
# 通过分析发现:
# 1)销售折扣20%(折扣为0.2表示打8折(即降价20%))是销售利润正负的拐点,当折扣继续增加,销售利润基本为负值。
# 2)当折扣为0.002和0.07时,单个品类单位时间的总利润有显著的提升,也就是营销中低折扣的"小刀"策略,可以有效刺激消费者购买欲望,进而提升销量和利润。
# 3)当折扣为0.85、0.55、0.57的时候,利润会出现一些极端的负数值,通过查看对应的商品种类和该折扣销售天数,
# 可以发现此种情况是特殊个例,属于基于特定商品、网红商品的引流活动,对整体商品的定价策略不具备代表性。[商业大数据分析与应用]